package pimmodel;

import static org.junit.Assert.*;
//import java.util.HashMap;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * 
 * Testklasse TelefonnrTest:<br>
 * JUnit Testklasse zur Klasse Telefonnr.
 * 
 * @author Thomas Schoenfeld
 * @version (20120901_01)
 *
 */
public class TelefonnrTest {
	
	private					ITelefonnr	telefonnrFestnetz1;
	private					ITelefonnr	telefonnrFestnetz2;
	
	private					String		teltyp1;
	private					String		festnetz1;
	

	@Before
	public void setUp() throws Exception {
		teltyp1		= "Festnetz1";
		festnetz1	= "0681 23456";
		
		telefonnrFestnetz1 = new Telefonnr("Festnetz1", "0681 23456");
		telefonnrFestnetz2 = new Telefonnr(teltyp1, festnetz1);
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testTelefonnrConstructor() {		
		try {
			telefonnrFestnetz1 = new Telefonnr(null, "0681 23456");
		}
		catch (IllegalArgumentException exptected) {}
		
		try {
			telefonnrFestnetz1 = new Telefonnr(" ", "0681 23456");
		}
		catch (IllegalArgumentException exptected) {}
		
		try {
			telefonnrFestnetz1 = new Telefonnr("Festnetz", null);
		}
		catch (IllegalArgumentException exptected) {}
		
		try {
			telefonnrFestnetz1 = new Telefonnr("Festnetz", " ");
		}
		catch (IllegalArgumentException exptected) {}		
	}

	@Test
	public void testTelefonnrCopyConstructor() {
		
		telefonnrFestnetz1 = new Telefonnr(telefonnrFestnetz2);
		
		assertEquals(telefonnrFestnetz1.getTelefontyp(), telefonnrFestnetz2.getTelefontyp());
		assertEquals(telefonnrFestnetz1.getTelefonnr(), telefonnrFestnetz2.getTelefonnr());		
		
		try {
			telefonnrFestnetz1 = new Telefonnr(null);	
		}
		catch (IllegalArgumentException exptected) {}			
	}	
	
	@Test
	public void testGetTelefontyp() {
		assertTrue(telefonnrFestnetz1.getTelefontyp() instanceof String);
		assertTrue(telefonnrFestnetz1.getTelefontyp().length() > 0);
		
		assertFalse(telefonnrFestnetz1.getTelefontyp() == null);
		assertFalse(telefonnrFestnetz1.getTelefontyp().isEmpty());
		
		assertEquals(telefonnrFestnetz1.getTelefontyp(), teltyp1);
		assertEquals(telefonnrFestnetz1.getTelefontyp(), "Festnetz1");		
	}

	@Test
	public void testSetTelefontyp() {
		try {
			telefonnrFestnetz1.setTelefontyp(null);		
		}
		catch (IllegalArgumentException exptected) {}		

		try {
			telefonnrFestnetz1.setTelefontyp(" ");		
		}
		catch (IllegalArgumentException exptected) {}						
	}

	@Test
	public void testGetTelefonnr() {
		assertTrue(telefonnrFestnetz1.getTelefonnr() instanceof String);
		assertTrue(telefonnrFestnetz1.getTelefonnr().length() > 0);

		assertFalse(telefonnrFestnetz1.getTelefonnr() == null);
		assertFalse(telefonnrFestnetz1.getTelefonnr().isEmpty());				
		
		assertEquals(telefonnrFestnetz1.getTelefonnr(), festnetz1);
		assertEquals(telefonnrFestnetz2.getTelefonnr(), "0681 23456");				
	}

	@Test
	public void testSetTelefonnr() {
		try {
			telefonnrFestnetz1.setTelefonnr(null);	
		}
		catch (IllegalArgumentException exptected) {}		

		try {
			telefonnrFestnetz1.setTelefonnr(" ");		
		}
		catch (IllegalArgumentException exptected) {}						
	}

	@Test
	public void testToString() {
		assertTrue(telefonnrFestnetz1.toString() != null);
		assertTrue(telefonnrFestnetz1.toString() instanceof String);
		
		String s = "Telefontyp = Festnetz1 Telefonnummer = 0681 23456";
		assertEquals(telefonnrFestnetz1.toString(), s);
	}

	@Test
	public void testObject() {
		assertTrue(telefonnrFestnetz1 != null);
		assertTrue(telefonnrFestnetz1 instanceof Object);
		assertTrue(telefonnrFestnetz1 instanceof Telefonnr);
	}

	@Test
	public void testGetClass() {
		assertTrue(telefonnrFestnetz1.getClass() != null);
		assertTrue(telefonnrFestnetz2.getClass() != null);
		assertTrue(telefonnrFestnetz1.getClass() == telefonnrFestnetz2.getClass());
	}

	@Test
	public void testHashCode() {
		telefonnrFestnetz1 = new Telefonnr("Festnetz", "0681 23456");
		telefonnrFestnetz2 = new Telefonnr("Festnetz", "0681 23456");
		
		assertEquals(telefonnrFestnetz1.hashCode(), telefonnrFestnetz2.hashCode());
		
		telefonnrFestnetz2 = new Telefonnr("Festnetz", "0681 2345");
		assertFalse(telefonnrFestnetz1.hashCode() == telefonnrFestnetz2.hashCode());
		
		telefonnrFestnetz2 = new Telefonnr("Festnetz1", "0681 23456");
		assertFalse(telefonnrFestnetz1.hashCode() == telefonnrFestnetz2.hashCode());
	}

	@Test
	public void testEquals() {
		ITelefonnr telnr1 = new Telefonnr(telefonnrFestnetz1);
		ITelefonnr telnr2 = new Telefonnr("Festnetz1", "0681 23456");
		
		assertFalse(telefonnrFestnetz1.equals(null));
		assertFalse(telnr1.equals(null));
		assertFalse(telnr2.equals(null));
		
		assertTrue(telnr1.equals(telnr2));
		
		
		// Reflexivitaet
		assertTrue(telefonnrFestnetz1.equals(telefonnrFestnetz1));
		
		// Symmetrie
		assertTrue(telefonnrFestnetz1.equals(telnr1));
		assertTrue(telnr1.equals(telefonnrFestnetz1));
		
		// Transitivitaet
		assertTrue(telefonnrFestnetz1.equals(telnr1));
		assertTrue(telnr1.equals(telnr2));
		assertTrue(telefonnrFestnetz1.equals(telnr2));
		assertTrue(telnr2.equals(telefonnrFestnetz1));
	}
	
	@Test
	public void testCompareTo() {
		ITelefonnr telnr1 = new Telefonnr(telefonnrFestnetz1);
		ITelefonnr telnr2 = new Telefonnr("Festnetz1", "0681 23456");
		ITelefonnr telnr3 = new Telefonnr("Festnetz1", "0681 23459");
		ITelefonnr telnr4 = new Telefonnr("Festnetz2", "0681 23456");
		ITelefonnr telnr5 = new Telefonnr("Festnetz3", "0681 23458");		
		
		assertTrue(telnr1.compareTo(telnr1) == 0);
		assertTrue(telnr1.compareTo(telnr2) == 0);
		assertTrue(telnr2.compareTo(telnr1) == 0);
		assertTrue(telnr2.compareTo(telnr3) == -1);
		assertTrue(telnr3.compareTo(telnr2) == 1);
		assertTrue(telnr2.compareTo(telnr4) == -1);
		assertTrue(telnr4.compareTo(telnr2) == 1);
		assertTrue(telnr3.compareTo(telnr5) == -1);		
	}
	
	@Test
	public void testClone() {
		ITelefonnr telnr2 = new Telefonnr("Festnetz1", "0681 23456");
		ITelefonnr telnr3 = telnr2.clone();
		
		assertEquals(telnr2, telnr3);
	}
	
}
